<?php

namespace util;

/**
 * 通用的树型类，可以生成任何树型结构
 */
class Trees
{

    public $arr    = [];                    // 生成树型结构所需要的2维数组
    public $icon   = ['│', '├─', '└─'];     // 生成树型结构所需修饰符号
    public $pidKey = 'pid';                 // 数组的父id字段
    public $name   = 'name';                // 数组显示内容的字段
    public $ensp   = '&ensp;&ensp;';        // 修饰样式空格，默认是1个字的宽度，&ensp;等半个em宽度
    private $res   = [];                    // 返回修饰后的树形数组

    /**
     * 树形类构造函数
     *
     * @param array $arr        待修饰数组
     * @param string $pid_key   数组的父id字段
     * @param string $name      数组显示内容的字段
     */
    public function __construct($arr = [], $pid_key = '', $name = '')
    {
        $this->arr = $arr;
        $this->pidKey = !empty($pid_key) ? $pid_key : $this->pidKey;
        $this->name   = !empty($name) ? $name : $this->name;
    }

    /**
     * 获得子级数组信息
     *
     * @param int $my_id    id数值
     * @return array|boolean
     */
    public function get_child($my_id = 0)
    {
        $new_arr = [];
        if (is_array($this->arr) && !empty($this->arr)) {
            foreach ($this->arr as $k=>$v) {
                if ($v[$this->pidKey] == $my_id) {
                    $new_arr[$k] = $v;
                }
            }
        }

        return $new_arr ? $new_arr : false;
    }

    /**
     * 获得树形数据
     *
     * @param int $my_id            表示获得这个ID下的所有子级
     * @param string $adds          修饰符内容：&ensp;&ensp;
     * @param boolean $reset_key    重置key值：true false
     * @return array
     */
    public function get_tree($my_id = 0, $adds = '', $reset_key = true)
    {
        $i = 1;
        $child = $this->get_child($my_id);
        if (!empty($child) && is_array($child)) {
            $count = count($child);
            foreach ($child as $id=>$val) {
                $j = '';
                $k = '';
                if ($i == $count) {
                    $j .= $this->icon[2];
                } else {
                    $j .= $this->icon[1];
                    $k  = $adds ? $this->icon[0] : '';
                }
                $spacer       = $adds ? $adds . $j : '';
                $val['_name'] = $spacer.' '.$val[$this->name];
                if ($reset_key) {
                    array_push($this->res, $val);
                } else {
                    $this->res[$id] = $val;
                }

                $this->get_tree($val['id'], $adds . $k . $this->ensp);
                $i++;
            }
        }

        return $this->res;
    }

}

